package com.small.helper;

import com.small.anontation.Inject;
import com.small.utils.ReflectionUtils;

import java.lang.reflect.Field;
import java.util.Map;

/**
 * IOC依赖注入：遍历所有的类，判断类里的属性带有@Inject注解的，通过反射将实例注入进该属性中
 * Created by fangzheng on 2018/1/30.
 */
public class IocHelper {
    static {
        /**
         * 获取所有BEAN_MAP
         * 遍历BEAN_MAP，获取class和实例
         * 获取每个class的所有field
         * 判断当前field上有没有inject注解
         * 如果有inject注解，通过反射给该实例（当前遍历的实例）的field属性注入实例（从BEAN_MAP中获取）
         */
        Map<Class<?>, Object> bean_map = BeanHelper.getBeanMap();
        if (!bean_map.isEmpty()) {
            for (Map.Entry<Class<?>, Object> beanEntry : bean_map.entrySet()) {
                Class<?> beanClass = beanEntry.getKey();
                Object beanInstance = beanEntry.getValue();
                Field[] fields = beanClass.getDeclaredFields();
                if (fields.length > 0) {
                    for (Field field : fields) {
                        if (field.isAnnotationPresent(Inject.class)) {//如果该field带有@Inject注解
                            //fieldClass：表示Service的类型
                            Class<?> fieldClass = field.getType();
                            //beanFileInstance：表示Service的实例
                            Object beanFieldInstance = bean_map.get(fieldClass);
                            //通过反射给Service注入实例
                            ReflectionUtils.setField(beanInstance, field, beanFieldInstance);
                        }
                    }
                }
            }
        }

    }
}
